package com.itheima.tlias84.utils;

import com.alibaba.fastjson2.JSONObject;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;

import java.util.Date;

/**
 * jwt token生成与验证（解析）
 */
public class JwtUtil {

    private static final String SIG = "defd2faf-46b9-4934-a08f-b5251f884a2d";

    private JwtUtil() {

    }

    /**
     * 生成token
     * @param username 用户名
     * @param password 密码
     * @param minutes 过期时间，以分钟为单位
     * @return token
     */
    public static String generateToken(String username, String password, int minutes) {
        //1.构建Jwt对象
        //2.指定header(一般省略)
        //3.指定payload，以及过期时间和生效时间
        //4.进行数字签名
        //5.生成token
        Date now = new Date();
        return Jwts.builder()
                .claim("username", username)
                .claim("password", password)
                .issuedAt(now)
                .expiration(new Date(now.getTime() + (long) minutes * 60 * 1000))
                .signWith(Keys.hmacShaKeyFor(SIG.getBytes()), Jwts.SIG.HS256) //HS256->hmacSha256
                //hmac: hash-based message authentication code 基于哈希运算的消息认证码
                //sha: secure hash algorithm              安全哈希算法 ↑
                .compact();
    }

    /**
     *  验证token
     * @param token 生成的token令牌
     * @return payload中的用户信息
     */
    public static JSONObject verifyToken(String token) {
        //1.构建解析对象
        //2.指定数字签名
        //3.指定被签名后的token
        JwtParser parser = Jwts.parser().verifyWith(Keys.hmacShaKeyFor(SIG.getBytes())).build();
        Claims payload = parser.parseSignedClaims(token).getPayload();
        JSONObject jsonObject = new JSONObject();

        jsonObject.put("username", payload.get("username"));
        jsonObject.put("password", payload.get("password"));
        return jsonObject;
        //没有完成token失效的处理和token不合法的处理
    }
}
